﻿namespace Contoso.ActiveDirectory {

    #region Usings
    using System;
    using System.Collections.Generic;
    using System.DirectoryServices;
    using System.Security.AccessControl;
    using System.Security.Principal;
    #endregion

    public interface IADBaseObjectProperties : 
        IComparable<ADBaseObjectProperties>, IEnumerable<ADBaseObjectProperties>, ICloneable {

        int AdminCount { get; }
        AuthorizationRuleCollection AccessRules { get; }
        string CanonicalName { get; }
        string CN { get; }
        CustomAttributes CustomAttributes { get; }
        string Description { get; }
        bool DestroyInputObject { get; }
        string DN { get; }
        string DNSDomain { get; }
        string Domain { get; }
        string DomainCN { get; }
        string DomainDN { get; }
        Guid DSASignature { get; }
        string Info { get; }
        bool IsCriticalSystemObject { get; }
        bool IsDeleted { get; }
        bool IsProtectedFromDelete { get; }
        bool IsRecycled { get; }
        bool IsValid { get; }
        string LastKnownParent { get; }
        string LdapDN { get; }
        DateTime ModifyTimeStampUTC { get; }
        string Name { get; }
        string ObjectCategory { get; }
        IReadOnlyList<string> ObjectClass { get; }
        Guid ObjectGuid { get; }
        ActiveDirectorySecurity ObjectSecurity { get; }
        SecurityIdentifier ObjectSid { get; }
        string ParentDN { get; }
        IReadOnlyList<ReplicationAttributeMetaData> ReplicationAttributeMetadata { get; }
        IReadOnlyList<ReplicationValueMetaData> ReplicationValueMetadata { get; }
        string Server { get; }
        bool ShowInAdvancedViewOnly { get; }
        SystemFlags SystemFlags { get; }
        string TopLevelOU { get; }
        string TopLevelOUDN { get; }
        DateTime WhenChanged { get; }
        DateTime WhenChangedUTC { get; }
        DateTime WhenCreated { get; }
        DateTime WhenCreatedUTC { get; }

        void GetObjectSecurity();
        void GetReplicationMetadata();
        T Refresh<T>() where T : ADBaseObjectProperties, new();
        void TrimStringProperties();

    }
}
